package leetCode;

import jianzhiOffer.ListNode;
import org.junit.Test;

/**
 * TODO
 *
 * @author 司松坡
 * @createTime 2023年03月01日
 */
public class LeetCode25 {

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     * int val;
     * ListNode next;
     * ListNode() {}
     * ListNode(int val) { this.val = val; }
     * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || head.next == null) {
            return head;
        }
        //定义假节点
        ListNode rs = new ListNode(0);
        rs.next = head;
        ListNode pre = rs;
        ListNode end = rs;
        while (end.next!=null){
            for(int i=0;i<k&&end != null;i++){
                end=end.next;
            }
            //如果end==null，即需要翻转的链表的节点数小于k，不执行翻转。
            if(end==null){
                break;
            }
            //先记录下end.next,方便后面链接链表
            ListNode next=end.next;
            //然后断开链表
            end.next=null;
            //记录下要翻转链表的头节点
            ListNode start=pre.next;
            //翻转链表,pre.next指向翻转后的链表。1->2 变成2->1。 dummy->2->1
            pre.next=reversal(start);
            //翻转后头节点变到最后。通过.next把断开的链表重新链接。
            start.next=next;
            //将pre换成下次要翻转的链表的头结点的上一个节点。即start
            pre=start;
            //翻转结束，将end置为下次要翻转的链表的头结点的上一个节点。即start
            end=start;
        }
        return rs.next;
    }

    /**
     * @param
     * @return
     * @Description 反转连表
     * @Date 2023/3/1
     */
    public ListNode reversal(ListNode node) {
        ListNode rs = null;
        ListNode listNode = node;
        while (listNode != null) {
            ListNode node1 = listNode.next;
            listNode.next = rs;
            rs = listNode;
            listNode = node1;
        }
        return rs;
    }


    @Test
    public void test() {
        ListNode reversal = reversal(new ListNode(1, new ListNode(2, new ListNode(3))));
        while (reversal.val != 0) {
            System.out.println(reversal.val);
            reversal = reversal.next;
        }
    }


}
